OpenCode Telegram Bot 系统梳理

基于 grinev/opencode-telegram-bot、OpenCode SDK、OpenCode Server 官方文档整理。
版本:v0.22 (npm @grinev/opencode-telegram-bot)

1. 概述

OpenCode Telegram Bot 是一个通过 Telegram 操控本地 OpenCode Server 的桥接程序。 由 Ruslan Grinev 开发,MIT 协议开源,基于 Node.js (TypeScript) + grammY 框架。

核心思路:把 Telegram 变成你手机上的 OpenCode 终端窗口。


2. 系统架构

2.1 行为图(系统"做什么")

用例图

系统角色只有一人(机器所有者),通过 Telegram Bot 对本地 OpenCode 进行远程操控。可选接入 STT/TTS/文档提取 API。

用例图
图 1:OpenCode Telegram Bot 用例图
// Demo: 用户发一条消息给 Bot 的命令映射
// 文本消息(非命令) → 作为 prompt 发给 OpenCode
// /status → 查服务器/项目/会话/模型信息
// /new → 创建新会话
// /abort → 终止当前任务
// /sessions → 浏览并切换会话
// /projects → 切换项目
// /task → 创建定时任务
// 语音消息 → STT 转录 → 作为 prompt 发送

活动图

消息从 Telegram 到达后的处理全流程。

活动图
图 2:消息处理活动图

时序图

一次完整的"用户发送 prompt → LLM 回复 → 用户看到结果"交互链路。

时序图
图 3:消息交互时序图

状态机图

Bot 自身生命周期状态及其与 OpenCode Server SSE 事件流的连接状态管理。

状态机图
图 4:Bot 生命周期状态机

2.2 结构图(系统"由什么组成")

组件图

组件图
图 5:系统组件图

部署图

部署图
图 6:典型部署拓扑

类图

类图
图 7:核心模块类图

3. 关键架构决策

决策背景效果
长轮询 getUpdates 而非 webhook 运行在本地机器 / 无公网 IP 的云服务器 零配置、无入站端口、适合所有网络环境
SSE 而非 WebSocket opencode serve 原生提供 /global/event SSE 端点 零额外握手开销,天然支持重连
单项目单活跃 session Telegram 约 1 msg/s 限速,多 session 并发容易竞态 行为可预测,交互式 Q&A 不会失控
setImmediate 调度事件 SSE 事件洪流可能阻塞 Telegram getUpdates 长轮询 Bot 不会被判离线,始终保持消息接收
编辑消息实现流式输出 逐条发送会导致刷屏,违反 Telegram UX 规范 同一条消息内持续更新(按 1s 节流)
代码块作为文件附件 (≤100KB) Telegram 单条消息 4096 字符限制 代码不受截断,支持语法高亮
30s 空闲超时主动断流 keepalive 老化可能导致连接假死 始终保持健康连接,指数退避重连
交互式 flow 互斥锁 多个交互(权限询问 + 命令菜单 + 会话切换)并发会破坏上下文 同一时刻只有一个交互流活跃,避免误操作
HTTP Basic Auth 保护 opencode serve 虽然绑定 127.0.0.1,但同主机多进程仍需隔离 可选 OPENCODE_SERVER_PASSWORD 即启动密码验证

4. 速查手册

4.1 Bot 命令一览

命令功能
/status服务器健康状态、当前项目、会话、模型信息
/new创建新会话
/abort终止当前任务(等效 ESC)
/detach从当前会话分离,不停止任务
/sessions浏览并切换最近会话
/messages浏览用户消息,支持 Revert(回退)和 Fork(分支)
/projects切换 OpenCode 项目
/worktree切换 git worktree(当前 repo)
/open浏览目录以添加项目
/ls交互式文件浏览器(当前项目目录)
/settings修改运行时设置
/rename重命名当前会话
/commands浏览并执行自定义命令和内置命令(init、review 等)
/skills浏览并执行 OpenCode skills
/mcps浏览并切换 MCP 服务器
/task创建定时任务
/tasklist浏览并删除定时任务
/opencode_start启动本地 OpenCode server
/opencode_stop停止本地 OpenCode server
/help显示可用命令

4.2 运行时设置 (/settings)

设置项说明可选值
Compact output mode紧凑输出模式on/off
Thinking content display是否显示模型推理过程on/off
Assistant run footer显示助手运行页脚on/off
Diff file attachments发送 diff 文件作为附件on/off
Response streaming mode回复流式输出模式edit / draft(实验性)
Audio repliesTTS 语音回复模式(需 TTS 配置)off / all / auto

4.3 快速启动 (npm)

# 1. 在 @BotFather 创建 Bot,拿到 token
# 2. 给 @userinfobot 发消息,拿到你的 user ID

# 3. 启动 opencode serve
opencode serve --port 4096 &

# 4. 启动 bot(首次运行交互式向导)
npx @grinev/opencode-telegram-bot@latest

# 或全局安装
npm install -g @grinev/opencode-telegram-bot
opencode-telegram start

# 后台守护模式
opencode-telegram start --daemon
opencode-telegram status
opencode-telegram stop

4.4 跟踪已有会话

# 方式一:单个 TUI,固定端口
opencode --port 4096

# 方式二:多个 TUI,共享后端
opencode serve --port 4096       # 终端1:启动后端
opencode attach http://127.0.0.1:4096  # 终端2+:attach

5. 环境变量速查

变量必填默认值说明
TELEGRAM_BOT_TOKEN是—@BotFather 获取的 token
TELEGRAM_ALLOWED_USER_ID是—你的数字 Telegram User ID
OPENCODE_API_URL否http://localhost:4096OpenCode Server 地址
OPENCODE_MODEL_PROVIDER是opencode默认模型提供商
OPENCODE_MODEL_ID是big-pickle默认模型 ID
BOT_LOCALE否en界面语言 (en/ar/de/es/fr/ru/zh)
TELEGRAM_PROXY_URL否—SOCKS5/HTTP 代理(绕过防火墙)
TELEGRAM_API_ROOT否https://api.telegram.org自建反向代理(企业网络)
OPENCODE_AUTO_RESTART_ENABLED否falsehealth check 失败时自动重启 serve
OPENCODE_SERVER_USERNAME否opencodeserve 认证用户名
OPENCODE_SERVER_PASSWORD否—serve 认证密码
STT_API_URL / STT_API_KEY否—语音转文字(Whisper 兼容 API)
TTS_PROVIDER / TTS_API_URL否—文字转语音(OpenAI / ElevenLabs / Google)
DOC_EXTRACTOR_URL否—文档提取 API(PDF/DOCX/PPTX)
TASK_LIMIT否10最大定时任务数
SCHEDULED_TASK_EXECUTION_TIMEOUT_MINUTES否120单次定时任务超时(分钟)
LOG_LEVEL否info日志级别 (debug/info/warn/error)

6. 部署方案

6.1 systemd 自启(推荐生产环境)

将 opencode serve 和 bot 各做成一个 systemd 服务,开机自启 + 崩溃自动重启:

# ---- /etc/systemd/system/opencode-serve.service ----
[Unit]
Description=OpenCode Server (serve :4096)
After=network-online.target
PartOf=opencode-telegram-bot.service
Wants=opencode-telegram-bot.service

[Service]
Type=simple
Environment=HOME=/root
ExecStart=/root/.opencode/bin/opencode serve --port 4096
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

# ---- /etc/systemd/system/opencode-telegram-bot.service ----
[Unit]
Description=OpenCode Telegram Bot
After=network-online.target opencode-serve.service
Requires=opencode-serve.service
BindsTo=opencode-serve.service

[Service]
Type=simple
Environment=HOME=/root
ExecStart=/usr/bin/opencode-telegram start
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

# 启用
systemctl daemon-reload
systemctl enable --now opencode-serve.service opencode-telegram-bot.service

# 日常操作
systemctl restart opencode-serve    # bot 自动联动
systemctl status opencode-telegram-bot
journalctl -u opencode-telegram-bot -f

6.2 Docker 多栈隔离(本地 Mac / 多项目)

# Personal Stack (个人项目)
docker run -d --name bot-personal \
  -e TELEGRAM_BOT_TOKEN=xxx \
  -e TELEGRAM_ALLOWED_USER_ID=123 \
  -v ~/projects/personal:/workspace \
  @grinev/opencode-telegram-bot

# Work Stack (公司项目)
docker run -d --name bot-work \
  -e TELEGRAM_BOT_TOKEN=yyy \
  -e TELEGRAM_ALLOWED_USER_ID=123 \
  -v ~/projects/work:/workspace \
  @grinev/opencode-telegram-bot

每个 Docker stack 包含:一个 bot 容器 + 一个 opencode serve 容器 + 一个工作目录 volume,通过内部 bridge 网络通信,与外界仅通过 Telegram API 交互。

6.3 注意事项